﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dao.Intermediarios;
using _InformaticaIndustrial_DerivdosVinicos.DTO;
using Dao;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class NuevaOrdenProduccion : Form
    {
        #region Property
        OrdenProduccion _ultOP = new OrdenProduccion();
        OrdenProduccion nvaOP = new OrdenProduccion();
        IPOrdenProduccion ipOrdenProduccion = new IPOrdenProduccion();
        Producto producto = new Producto();
        IPProducto ipProd = new IPProducto();
        IPEstructuraProducto ipEP = new IPEstructuraProducto();
        IPMateriaPrima ipMP = new IPMateriaPrima();
        IPComponente ipComp = new IPComponente();
        IPDetalleOP ipDetalle = new IPDetalleOP();
        List<Producto> productos;
        List<DetalleOP> detallesOP = new List<DetalleOP>();
        List<DTOComprar> faltantes = new List<DTOComprar>();
        DTOComprar falta;
        DateTime fechaEjec;
        string nombreProd;
        private Principal principal;
        string idP;
        int cantProducir;
        int detId;
        double cantAComprarMP;
        double cantAComprarPC;
        DialogResult result;
        #endregion Property

        public NuevaOrdenProduccion(Principal principal)
        {
            InitializeComponent();
            try
            {
                //fecha de la orden de produccion
                this.txtFecha.Text = DateTime.Now.ToShortDateString();
                //asigna el estado pendiente
                txtEstado.Text = "Pendiente";

                List<OrdenProduccion> lordenes = ipOrdenProduccion.getAll<OrdenProduccion>();
                if (lordenes.Count == 0)
                    txtNroOP.Text = "1";
                else
                {
                    _ultOP = lordenes.Last();
                    txtNroOP.Text = (_ultOP.idOP + 1).ToString();
                }

                cargarComboProducto();
                dgProductos.ReadOnly = false;
                crearOrdenProduccion();

                this.principal = principal;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        public NuevaOrdenProduccion(Demanda d)
        {
            InitializeComponent();
            try
            {
                //fecha de la orden de produccion
                this.txtFecha.Text = DateTime.Now.ToShortDateString();
                //asigna el estado pendiente
                txtEstado.Text = "Pendiente";
                txtCant.Text = d.demandaEstimada.ToString();

                List<OrdenProduccion> lordenes = ipOrdenProduccion.getAll<OrdenProduccion>();
                if (lordenes.Count == 0)
                    txtNroOP.Text = "1";
                else
                {
                    _ultOP = lordenes.Last();
                    txtNroOP.Text = (_ultOP.idOP + 1).ToString();
                }

                cargarComboProducto();
                dgProductos.ReadOnly = false;
                crearOrdenProduccion();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
        }

        public void crearOrdenProduccion()
        {
            nvaOP.estado = txtEstado.Text;
            nvaOP.fechaCreacion = Convert.ToDateTime(this.txtFecha.Text);
            nvaOP.fechaEjecucion = fechaEjec;
            nvaOP.nroOP = Convert.ToInt16(txtNroOP.Text);
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        public void cargarComboProducto()
        {
            comboBoxProducto.DataSource = ipProd.getAll<Producto>();
        }
        //selecciona un producto
        private void comboBoxProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            idP = comboBoxProducto.SelectedValue.ToString();
        }

        private void btAgregar_Click(object sender, EventArgs e)
        {
            agregarProducto();
        }

        public void agregarProducto()
        {
            try
            {
                cantProducir = Convert.ToInt16(txtCant.Text);
                //elijo producto y cantidad a producir
                //busco la estructura de producto
                //por cada MP

                if (!txtCant.Text.Equals(""))
                {
                    productos = ipProd.getByCriterio<Producto>("IdProducto", "=", idP);
                    foreach (var p in productos)
                    {
                        nombreProd = p.NombreProducto;
                        detId = p.IdProducto;
                    }
                    List<EstructuraProducto> listaEP = ipEP.getByCriterio<EstructuraProducto>("IdProducto", "=", idP);
                    IList<MateriaPrima> mp;
                    IList<Componente> comp;
                    int cantMPNecesaria;
                    int cantPCNecesario;
                    
                    foreach (var ep in listaEP)
                    {
                        //por cada materia prima/componente que utiliza, obtener la cantidad por producto
                        if (ep.IdMateriaPrima != null)
                        {

                            cantMPNecesaria = Convert.ToInt32((cantProducir * Convert.ToInt32(ep.cantidadMP)) /  (ep.CantidadAProducir));
                            mp = ipMP.getByCriterio<MateriaPrima>("IdMP", "=", ep.IdMateriaPrima.ToString());

                            foreach (var m in mp)
                            {
                                if (m.cantidad >= cantMPNecesaria)
                                {
                                    m.cantidad = m.cantidad - cantMPNecesaria;
                                    Intermediario.confirmarCambios();
                                    // cargarDetalle();
                                }
                                else
                                {
                                    cantAComprarMP = Convert.ToDouble(cantMPNecesaria - m.cantidad);
                                    falta = new DTOComprar();
                                    falta.cantAComprarMP = cantAComprarMP;
                                    falta.codMP = m.IdMP.ToString();
                                    falta.esMP = true;
                                    faltantes.Add(falta);
                                    // mostrarMensaje();
                                    //this.Close();
                                }
                            }
                        }

                        if (ep.IdComponente != null)
                        {
                            cantPCNecesario =  Convert.ToInt32((cantProducir * Convert.ToInt16(ep.cantidadPC))/  (ep.CantidadAProducir));
                            comp = ipComp.getCriterioById<Componente>("IdComponente", "=", Convert.ToInt16(ep.IdComponente));
                            //Componente c=comp.ElementAt(0);
                            foreach (var c in comp)
                            {
                                if (c.cantidad >= cantPCNecesario)
                                {
                                    c.cantidad = c.cantidad - cantPCNecesario;
                                    Intermediario.confirmarCambios();
                                    // cargarDetalle();
                                }
                                else
                                {
                                    cantAComprarPC = Convert.ToDouble(cantPCNecesario - c.cantidad);
                                    falta = new DTOComprar();
                                    falta.cantAComprarPC = cantAComprarPC;
                                    falta.codPC = c.IdComponente.ToString();
                                    falta.esMP = false;
                                    faltantes.Add(falta);
                                    //  mostrarMensaje();
                                    this.Close();
                                }
                            }
                        }
                    }

                    if (faltantes.Count != 0)
                        mostrarMensaje();
                    
                        cargarDetalle();
                        this.Show();

                }
                else
                {
                    MessageBox.Show("Debe ingresar cantidad");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        
            public void cargarDetalle()
            {
                try
                {

                comboBoxProducto.Enabled = true;

                DataGridViewRow fila = new DataGridViewRow();

                DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();

                cell = new DataGridViewTextBoxCell();

                cell.Value = nombreProd;
                fila.Cells.Add(cell);

                cell = new DataGridViewTextBoxCell();
                cell.Value = cantProducir;
                fila.Cells.Add(cell);

                dgProductos.Rows.Add(fila);
                //PARA GUARDAR EL DETALLE--PONER EN UN METODO
                DetalleOP detOP = new DetalleOP();
                //detOP.idOP = (_ultOP.idOP) + 1;
                detOP.cantidad = cantProducir;
                detOP.IdProducto = detId;
                detallesOP.Add(detOP);
                }
                catch(Exception exp)
                {
                    MessageBox.Show(exp.Message);
                }
            }
           

        public void mostrarMensaje()
        {
             result = MessageBox.Show("La cantidad de MP/Componente es insuficiente. Desea crear una nueva OC?", "Atención", MessageBoxButtons.OKCancel);
            
            //if (result == DialogResult.OK)
            //{
            //    Form formOrdenCompra = new _InformaticaIndustrial_DerivdosVinicos.Interfaz.NuevaOrdenCompra(faltantes);
            //    formOrdenCompra.ShowDialog();
                
            //   // this.Visible = true;   // Para que sea visible la Interfaz principal
            //    //formOrdenCompra.Visible = true; // Para que sea visible la Interfaz de MaestroArticulos
            
            //}
            //else
            //{
            //    MessageBox.Show("No es posible crear la OP");
            //    this.Close();
            //}
        }

        private void dtFechaEjecucion_ValueChanged(object sender, EventArgs e)
        {
            fechaEjec = Convert.ToDateTime(dtFechaEjecucion.Value);
        }

        private void txtCant_TextChanged(object sender, EventArgs e)
        {
            // cantProducir = Convert.ToInt16(txtCant.Text);
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {


            ipOrdenProduccion.save<OrdenProduccion>(nvaOP);
            Intermediario.confirmarCambios();

            foreach (var d in detallesOP)
            {
                d.idOP = nvaOP.idOP;
                ipDetalle.save<DetalleOP>(d);
                Intermediario.confirmarCambios();
            }


            MessageBox.Show("La orden ha sido creada.");


            if (result == DialogResult.OK)
            {
                Form formOrdenCompra = new _InformaticaIndustrial_DerivdosVinicos.Interfaz.NuevaOrdenCompra(faltantes);
                formOrdenCompra.ShowDialog();

                 //this.Visible = true;   // Para que sea visible la Interfaz principal
                //formOrdenCompra.Visible = true; // Para que sea visible la Interfaz de MaestroArticulos
                this.Close();

            }
            else
            {
                MessageBox.Show("No es posible crear la OP");
                this.Close();
            }
        }
    }

}










